-
-
Notifications
You must be signed in to change notification settings - Fork 958
feat: mcp bundle tool integration #7595
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
c0836f7 to
512c885
Compare
512c885 to
a7b8b8f
Compare
d136520 to
b904a0d
Compare
rvanlaak
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Exciting that the mcp repo's schema PR is merged now, and you're able to spend time on API Platform integration.
Tried reviewing this PR without checking it out and testing it, so please feel free to ignore all my comments / suggestions / nitpicks 🙌 Just trying to provide you with another pov at some classes.
| true | ||
| ); | ||
| } | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
throw LogicException here?
| } | ||
| } | ||
|
|
||
| return null; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
As tell-dont-ask implies we expect creation of the operation, edge cases could lead to clear exceptions on how to resolve those. What about dropping nullability on the return typehint, and throw LogicException here?
| Put::class, | ||
| ApiResource::class, | ||
| ] as $class) { | ||
| $container->registerAttributeForAutoconfiguration($class, static function (ChildDefinition $definition): void { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What about letting all these classes extend a Resource interface, and solely register the tag on that class? Or even better; consider the FQCN of that interface as the tag? Interface composition would be great way to document behaviors.
| use Symfony\Component\WebLink\Link as WebLink; | ||
|
|
||
| #[\Attribute(\Attribute::TARGET_CLASS | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)] | ||
| final class McpTool extends HttpOperation |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is the tool really the operation? Feels like there should be something in the middle of tool handling as well, to allow (like the symfony ai implementations) dispatch specific events around the handling.
Rework of #7458
Now with a simpler approach, this gives the ability to add McpTool (upcoming McpResource) to any API Platform environment giving access to:
item_uri_template)CallToolResult(from the php-sdk itself for images, sound etc.)TODO:
#[McpTool]attribute#[McpResource]Because MCP uses JSON-RPC under the hood with some particular response objects (from php-sdk) we can not change returned headers yet (we'll work on an extension point).